package com.xuanyue.db.xuan.core.table;

import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Set;

import com.xuanyue.db.xuan.core.table.expr.Expr;
import com.xuanyue.db.xuan.core.table.expr.ExprValue;
import com.xuanyue.db.xuan.core.table.expr.SortTemplate;
import com.xuanyue.db.xuan.msg.VLAUETYPE;

/**
 * 数据表接口
 * @author 解观海
 * @email  guanhaixie@sina.cn
 * @date 2020年6月23日
 *
 */
public interface IXyTable extends IPersistence{

	public static final String VERSION_COLUMN = "version";
	public static final String SORT_OBJECT_NAME = "SORT_OBJECT_NAME";
	
	/**
	 * 行掩码，用于软删除。
	 * @return
	 */
	public IBitIndex getMask();
	/**
	 * 表名
	 * @return
	 */
	public String getName();
	/**
	 * 列信息
	 * @return
	 */
	public Map<String,IColumn> getName2column();
	/**
	 * 获得列
	 * @param cname
	 * @return
	 */
	public <T extends IColumn>T getColumn(String cname);
	/**
	 * 添加一列
	 * @param name
	 * @param column
	 */
	public void addColumn(String name,IColumn column);
	/**
	 * 删除一列
	 * @param cname
	 * @author 解观海
	 * @date 2021年1月8日
	 */
	public void dropColumn(String cname);
	
	/**
	 * 申请资源
	 * 简单银行家算法：
	 * 一次性申请最大使用资源
	 * @param maxSouce
	 * @return
	 * @throws NoSuchElementException
	 * @throws IllegalStateException
	 * @throws Exception
	 */
	public List<IBitIndex> apply(int maxSouce) ;
	/**
	 * 返回资源
	 * @param sources
	 */
	public void returnSource(List<IBitIndex> sources);
	/**
	 * 逻辑运算
	 * @param fieldName 列名称
	 * @param op   >,>=,<,<=,=,!=
	 * @param v  值
	 * @param caches 计算时需要的内存缓冲
	 */
	public void expr(Expr expr,List<IBitIndex> caches);


	/**
	 * id 移出保护区
	 * @param index
	 * @author 解观海
	 * @date 2021年1月1日
	 */
	public void freeId(String key,int index,boolean write);
	
	/**
	 * id 进入保护区
	 * @param id
	 * @return
	 * @author 解观海
	 * @throws InterruptedException 
	 * @date 2021年1月1日
	 */
	public void id2Reserve(String key,int id,boolean write);
	
	/**
	 * 检查逻辑表达是否有错误，如果没有返回执行本逻辑表达式所需的资源数量
	 * @param expr
	 * @return
	 * @author 解观海
	 * @date 2020年12月26日
	 */
	public int checkAndContSource(Expr expr);
	
	/**
	 * 插入
	 * @param vs
	 * @return
	 */
	public int insertInto(Map<String,ExprValue> vs);
	
	public List<ExprValue> insertIntoBatch(List<Map<String,ExprValue>> vsl);
	
	/**
	 * 检查待插入的数据是否合法
	 * @param vs
	 * @return 非法列的名称
	 */
	public String insertIntoCheck(Map<String,ExprValue> vs);
	/**
	 * 修改
	 * @param vs
	 * @return
	 */
	public int updateByRowid(Map<String,ExprValue> vs,int rowid,long version);
	
	/**
	 * 删除
	 * @param rowid
	 * @return
	 */
	public int deleteByRowid(int rowid,long version);
	/**
	 * 刷新rowId
	 * @param rowId
	 */
	public void flush(int rowId);
	
	
	/**
	 * 读取数据并返回排序对象
	 * 读取数据时，id进入保护区
	 * 
	 * @param rowId
	 * @param fields
	 * @param sortElementList
	 * @return
	 * @author 解观海
	 * @date 2021年1月7日
	 */
	public Map<String,ExprValue> readByIdReserve(int rowId,Set<String> fields,List<ISortElement> sortElementList,long versionNow);
	 
	
	/**
	 * 统计表中bit向量的个数。
	 * @return
	 */
	public int getDataSize();
	/**
	 * 列属性
	 * @param fn
	 * @return
	 */
	public VLAUETYPE getType(String fn);
	/**
	 * bit向量封装为排序单元并返回。
	 * @param fn
	 * @param isDesc
	 * @param key
	 * @return
	 */
	public List<ISortElement> getSortE(SortTemplate sortTemplate);
	/**
	 * 初始化
	 * @param path
	 * @throws Exception
	 */
	public void init();
	/**
	 * 保存一行
	 * @param path
	 * @param rowId
	 * @throws Exception
	 */
	public void saveRow(int rowId)throws Exception;
	
	/**
	 * 数据分段锁的id
	 * @param rowId
	 * @return
	 */
	public static int getLockId(int rowId) {
		return rowId/6400;
	}

	/**
	 * 获得当前的全局数据版本
	 * @return
	 * @author 解观海
	 * @date 2021年1月1日
	 */
	public long getCurrentVersion();
	
	public void setSource(int source);
}
